<?php

session_start();

include_once "metier/connexion.php";

redirigerSiNonConnecte();

include_once "metier/XSRF.php";




/******GESTION XSRF******/
if(isset($_GET["modifier"])) {
	$nomToken = "MODIFICATION_ANNONCE";
	$url = "modifAnnonce.php?".(isset($_GET["id"])?("id=".$_GET["id"]."&"):"")."e=token";
}
else {
	$nomToken = "CREATION_ANNONCE";
	$url = "creerAnnonce.php?e=token";
}
//Si un token est passé en paramètre
if(isset($_POST["token"])) {
	//Si le token est valide
	if(!validerToken($nomToken, $_POST["token"])) {
		header("Location: ".$url);
		exit;
	}
}
else {
	header("Location: ".$url);
	exit;
}
/******FIN XSRF******/




//Si la page est en mode modification mais que l'id de l'annonce n'est pas précisée
if(isset($_GET["modifier"])) {
	//Si l'id de l'annonce à modifier n'est pas donné ou n'est pas numérique
	if(!isset($_GET["id"]) || !is_numeric($_GET["id"])) {
		header("Location: index.php");
		exit;
	}
	//Sinon on vérifie que l'annonce appartient bien à l'utilisateur qui est connecté
	else {
		//Ouverture de la base de données
		$bd = new PDO("mysql:host=localhost;dbname=viagra", "root", "root");
		
		//Requête
		$requete = $bd->query("SELECT Count(id) AS nbannonces FROM annonce WHERE auteur=".htmlentities(strip_tags($_SESSION["id"])));
		$resultat = $requete->fetch(PDO::FETCH_OBJ);
		
		//Si l'annonce n'appartient pas à l'utilisateur connecté, on redirige l'utilisateur vers l'index
		if($resultat->nbannonces == 0) {
			header("Location: index.php");
			exit;
		}
		
		//Fermeture de la base de données
		$bd = null;
	}
}

//Si l'utilisateur a passé tous les champs en POST
if(isset($_POST["titre"]) && isset($_POST["description"]) && isset($_POST["categorie"])) {
	
	//Ouverture de la base de données
	$bd = new PDO("mysql:host=localhost;dbname=viagra", "root", "root");
	
	//Gestion du titre
	$titre = htmlentities(strip_tags($_POST["titre"])); //XSS
	if(empty($titre) || strlen($titre) > 255) {
		header("Location: creerAnnonce.php?e=titre");
		exit;
	}
	$titre = $bd->quote($titre);
	
	//Gestion de la description
	$description = htmlentities(strip_tags($_POST["description"])); //XSS
	if(empty($description)) {
		header("Location: creerAnnonce.php?e=description");
		exit;
	}
	$description = $bd->quote($description);
	
	//Gestion de la catégorie
	$categorie = htmlentities(strip_tags($_POST["categorie"])); //XSS
	if(empty($categorie) || !in_array($categorie, array("vehicules", "maison", "immobilier", "multimedia", "loisirs", "emploiservices"))) {
		header("Location: creerAnnonce.php?e=categorie");
		exit;
	}
	$categorie = $bd->quote($categorie);
	
	//Gestion du prix
	$prix = 0;
	if(isset($_POST["prix"]))
		$prixEchap = htmlentities(strip_tags($_POST["prix"])); //XSS
	if(!empty($prixEchap) && is_numeric($prixEchap))
		$prix = $prixEchap;
	
	//Gestion de l'adresse
	if(isset($_POST["adresse"]))
		$adresseEchap = htmlentities(strip_tags($_POST["adresse"])); //XSS
	$adresse = "NULL";
	if(!empty($adresseEchap))
		$adresse = $bd->quote($adresseEchap);
	
	//Création de la requête
	//Si la page n'est en mode modification
	if(!isset($_GET["modifier"])) {
		$requete = "INSERT INTO annonce (titre, description, categorie, prix, adresse, date, auteur) VALUES (
			".$titre.",
			".$description.",
			".$categorie.",
			".$prix.",
			".$adresse.",
			".time().",
			".$_SESSION["id"]."
		)";
	}
	else {
		$requete = "UPDATE annonce SET
			titre=".$titre.",
			description=".$description.",
			categorie=".$categorie.",
			prix=".$prix.",
			adresse=".$adresse.",
			date=".time()."
		WHERE id=".$_GET["id"];
	}
	
	//Si on peut démarrer une nouvelle transaction
	if($bd->beginTransaction()) {
	
		//Si on peut exécuter la requête de la requête
		if($bd->exec($requete) !== false) {
			
			if(!isset($_GET["modifier"]))
				$idannonce = $bd->lastInsertId();
			else
				$idannonce = $_GET["id"];
			
			//Si une erreur a été détecté durant pendant l'envoi de l'image sur le serveur
			if($_FILES["img"]["error"] != UPLOAD_ERR_OK && $_FILES["img"]["error"] != UPLOAD_ERR_NO_FILE) {   
			
				//On annule les changements de la base de données
				$bd->rollBack();
				
				//Fermeture de la base de données
				$bd = null;
				
				//Selon le type d'erreur; on renvoie l'utilisateur sur la page de création d'annonce
				switch($_FILES["img"]["error"]){     
					case UPLOAD_ERR_INI_SIZE: //Problème de taille (plus grande que la maximum définie dans php.ini)
						if(!isset($_GET["modifier"]))
							header("Location: creerAnnonce.php?e=tailleimage");
						else
							header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=tailleimage");
						exit;
					case UPLOAD_ERR_FORM_SIZE: //Problème de taille (plus grande que la maximum définie dans le formulaire)
						if(!isset($_GET["modifier"]))
							header("Location: creerAnnonce.php?e=tailleimage");
						else
							header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=tailleimage");
						exit;
					case UPLOAD_ERR_PARTIAL: //Le fichier n'a pas été envoyé en entier
						if(!isset($_GET["modifier"]))
							header("Location: creerAnnonce.php?e=envoiimage");
						else
							header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=envoiimage");
						exit;
					default: //Sinon
						if(!isset($_GET["modifier"]))
							header("Location: creerAnnonce.php?e=image");
						else
							header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=image");
						exit;
				}
				
			}
			
			//Si aucune erreur pendant l'envoi du fichier (error=UPLOAD_ERR_OK)
			else if($_FILES["img"]["error"] == UPLOAD_ERR_OK) {
				
				//On définit le dossier dans lequel on va stocker les images
				$dossier = 'imgAnnonces/';
				
				//Si on est en modification mais qu'on ne peut pas supprimer l'ancienne image
				if(isset($_GET["modifier"]) && is_file($dossier.$idannonce.".jpg") && !unlink($dossier.$idannonce.".jpg")) {
				
					//On annule les changements dans la base de données
					$bd->rollBack();
					
					//Fermeture de la base de données
					$bd = null;
					
					//On redirige l'utilisateur vers la page de création
					header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=image");
					exit;
				}
				
				//Si on peut stocker le fichier sur le serveur
				if(!move_uploaded_file($_FILES["img"]['tmp_name'], $dossier.$idannonce.".jpg")) {
				
					//On annule les changements dans la base de données
					$bd->rollBack();
					
					//Fermeture de la base de données
					$bd = null;
					
					//On redirige l'utilisateur vers la page de création ou de modification
					if(!isset($_GET["modifier"]))
						header("Location: creerAnnonce.php?e=image");
					else
						header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=image");
					exit;
				}
				
			}
			
			//Si on peut commettre les changements apportés à la base de données
			if($bd->commit()) {
				
				//Fermeture de la base de données
				$bd = null;
				
				//Redirection vers la page confirmant la publication de l'annonce
				if(!isset($_GET["modifier"]))
					header("Location: annonce.php?id=".$idannonce."&s=creationannonce");
				else
					header("Location: annonce.php?id=".$idannonce."&s=modificationannonce");
				exit;
				
			}
			
			//Si on a pas réussi à commettre les changements
			else {
				
				//Effectuer un rollBack
				$bd->rollBack();
				
				//Fermeture de la base de données
				$bd = null;
				
				//Redirection vers la page de création ou de modification
				if(!isset($_GET["modifier"]))
					header("Location: creerAnnonce.php?e=ecriturebd&1");
				else
					header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=ecriturebd&1");
				exit;
				
			}
		}
		
		//Si on a pas réussi à exécuter la requête
		else {
			//Effectuer un rollBack (pour fermer la transaction en cours)
			$bd->rollBack();
			
			//Fermeture de la base de donnÈes
			$bd = null;
			
			//Redirection vers la page de création ou de modification
			if(!isset($_GET["modifier"]))
				header("Location: creerAnnonce.php?e=ecriturebd&2");
			else
				header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=ecriturebd&2");
			exit;
			
		}
	}
	
	//Si on a pas réussi à démarrer la transaction
	else {
		
		//Fermeture de la base de donnÈes
		$bd = null;
		
		//Redirection vers la page de création ou de modification
		if(!isset($_GET["modifier"]))
			header("Location: creerAnnonce.php?e=ecriturebd&3");
		else
			header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=ecriturebd&3");
		exit;
		
	}

}

//Si les valeurs du formulaire ne sont pas toutes rentrées
else {
	
	//On redirige vers la page de création ou de modification
	if(!isset($_GET["modifier"]))
		header("Location: creerAnnonce.php?e=formulaire");
	else
		header("Location: modifAnnonce.php?id=".$_GET["id"]."&e=formulaire");
	exit;
	
}

?>	